package Leetcode.数组字符串;

import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName 统计参与通信的服务器
 * @since: 2023/8/24 09:24
 * @auth: kirito
 * @description:
 *  *这里有一幅服务器分布图，服务器的位置标识在 m * n 的整数矩阵网格 grid 中，
 *  * 1 表示单元格上有服务器，0 表示没有。
 *  *
 *  * 如果两台服务器位于同一行或者同一列，我们就认为它们之间可以进行通信。
 *  *
 *  * 请你统计并返回能够与至少一台其他服务器进行通信的服务器的数量。
 *
 *  该方法用于统计网格中满足条件的服务器数量。网格中的每个元素表示一个位置，
 *  其中1表示服务器，0表示空位置。满足条件的服务器是指在同一行或同一列上至少有一个其他服务器的服务器。
 *
 * 算法的思路是先遍历网格，统计每行和每列中的服务器数量，
 * 并将结果存储在row和col两个Map中。然后再次遍历网格，对每个位置进行判断，
 * 如果当前位置是服务器且满足至少有一行或一列中有其他服务器的条件，则将结果计数器增加1。
 *
 * 最后返回计数器的值作为结果，表示满足条件的服务器数量。
 **/
public class 统计参与通信的服务器 {
    public int countServers(int[][] grid) {
        int res = 0;  // 计数器，用于统计满足条件的服务器数量
        Map<Integer,Integer> row = new HashMap<>();  // 存储每行中服务器的数量
        Map<Integer,Integer> col = new HashMap<>();  // 存储每列中服务器的数量
        int m = grid.length;  // 网格的行数
        int n = grid[0].length;  // 网格的列数

        // 第一次遍历网格，统计每行和每列中服务器的数量
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if(grid[i][j] == 1){  // 如果当前位置是服务器
                    row.put(i, row.getOrDefault(i, 0) + 1);  // 在row中记录该行的服务器数量
                    col.put(j, col.getOrDefault(j, 0) + 1);  // 在col中记录该列的服务器数量
                }
            }
        }

        // 第二次遍历网格，找到满足条件的服务器
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if(grid[i][j] == 1 && (row.get(i) > 1 || col.get(j) > 1)){
                    // 如果当前位置是服务器，并且该行或该列中至少有两个服务器
                    res++;  // 增加计数器
                }
            }
        }
        return res;  // 返回统计结果
    }
}
